package com.luo.backend.repository;

import com.luo.backend.entity.Order;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 订单数据访问接口
 */
@Repository
public interface OrderRepository extends JpaRepository<Order, Long>, JpaSpecificationExecutor<Order> {
    
    /**
     * 根据用户ID查找订单（分页）
     */
    Page<Order> findByUserIdOrderByCreatedAtDesc(Long userId, Pageable pageable);
    
    /**
     * 根据用户ID查找最近订单 - AI推荐使用
     */
    @Query("SELECT o FROM Order o WHERE o.userId = :userId ORDER BY o.createdAt DESC")
    List<Order> findTop5ByUserIdOrderByCreatedAtDesc(@Param("userId") Long userId, Pageable pageable);
    
    /**
     * 根据用户ID和状态查找订单（分页）
     */
    Page<Order> findByUserIdAndStatusOrderByCreatedAtDesc(Long userId, String status, Pageable pageable);
    
    /**
     * 根据用户ID和订单ID查找订单
     */
    Optional<Order> findByIdAndUserId(Long id, Long userId);
    
    /**
     * 根据订单号查找订单
     */
    Optional<Order> findByOrderNo(String orderNo);
    
    /**
     * 检查订单号是否存在
     */
    boolean existsByOrderNo(String orderNo);
    
    // ========== 商家端查询方法 ==========
    
    /**
     * 统计商家指定状态的订单数量
     */
    Long countByMerchantIdAndStatus(Long merchantId, String status);
    
    /**
     * 统计商家备货中且未发货的订单数量
     */
    Long countByMerchantIdAndStatusAndShippedAtIsNull(Long merchantId, String status);
    
    /**
     * 查询商家在指定时间范围内的订单
     */
    List<Order> findByMerchantIdAndCreatedAtBetween(Long merchantId, LocalDateTime start, LocalDateTime end);
    
    /**
     * 查询商家所有订单（按创建时间倒序）
     */
    List<Order> findByMerchantIdOrderByCreatedAtDesc(Long merchantId);
    
    /**
     * 查询商家指定状态的订单（按创建时间倒序）
     */
    List<Order> findByMerchantIdAndStatusOrderByCreatedAtDesc(Long merchantId, String status);
    
    // ===== 管理员接口查询方法 =====
    
    /**
     * 统计用户订单数量
     */
    long countByUserId(Long userId);
    
    /**
     * 统计用户指定状态的订单数量
     */
    long countByUserIdAndStatus(Long userId, String status);
    
    /**
     * 统计用户多个状态的订单数量
     */
    long countByUserIdAndStatusIn(Long userId, List<String> statuses);
    
    /**
     * 查询用户订单（分页，按创建时间倒序）
     */
    List<Order> findByUserId(Long userId, Pageable pageable);
    
    /**
     * 计算用户指定状态的总消费金额
     */
    @Query("SELECT SUM(o.totalAmount) FROM Order o WHERE o.userId = :userId AND o.status = :status")
    java.math.BigDecimal sumTotalAmountByUserIdAndStatus(@Param("userId") Long userId, @Param("status") String status);
    
    /**
     * 统计商家订单数量
     */
    long countByMerchantId(Long merchantId);
    
    /**
     * 统计商家多个状态的订单数量
     */
    long countByMerchantIdAndStatusIn(Long merchantId, List<String> statuses);
    
    /**
     * 查询商家订单（分页，按创建时间倒序）
     */
    List<Order> findByMerchantId(Long merchantId, Pageable pageable);
    
    /**
     * 计算商家指定状态的总营收
     */
    @Query("SELECT SUM(o.totalAmount) FROM Order o WHERE o.merchantId = :merchantId AND o.status = :status")
    java.math.BigDecimal sumTotalAmountByMerchantIdAndStatus(@Param("merchantId") Long merchantId, @Param("status") String status);
    
    /**
     * 计算指定状态的总营收（全平台）
     */
    @Query("SELECT SUM(o.totalAmount) FROM Order o WHERE o.status = :status")
    java.math.BigDecimal sumTotalAmountByStatus(@Param("status") String status);
}

